package org.dromara.demo.controller;

import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.dromara.sms4j.api.SmsBlend;
import org.dromara.sms4j.api.entity.SmsResponse;
import org.dromara.sms4j.core.factory.SmsFactory;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.LinkedHashMap;


/**
 * @Author 刘武贵
 * @Date 2024/8/15 22:00
 * @Description 功能描述：短信演示案例
 * 请先阅读文档 否则无法使用
 */
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/demo/sms")
public class SmsController {
    /**
     * 发送短信Aliyun
     * 此方法通过调用SmsFactory获取SmsBlend实例，并使用该实例发送短信
     * 它首先准备了一个包含验证码的Map，然后调用sendMessage方法
     * 使用指定的手机号码、模板ID和验证码发送短信，并返回发送结果
     *
     * @param phones     电话号，用于接收短信
     * @param templateId 模板ID，定义了短信的格式和内容
     * @return 返回发送结果，包括是否成功及响应信息
     */
    @GetMapping("/sendAliyun")
    public R<Object> sendAliyun(String phones, String templateId) {
        // 准备验证码等信息，这里简单示例使用固定的验证码"1234"
        LinkedHashMap<String, String> map = new LinkedHashMap<>(1);
        map.put("code", "1234");
        // 通过工厂模式获取短信服务实例，这里使用的是阿里云配置为"config1"的服务
        SmsBlend smsBlend = SmsFactory.getSmsBlend("config1");
        // 使用指定的手机号码、短信模板ID和参数发送短信，并获取响应结果
        SmsResponse smsResponse = smsBlend.sendMessage(phones, templateId, map);
        return R.ok(smsResponse);
    }

    /**
     * 发送短信Tencent
     *
     * @param phones     电话号，用于接收短信
     * @param templateId 模板ID，用于指定发送的短信模板
     * @return 返回发送结果，包括短信发送的响应信息
     */
    @GetMapping("/sendTencent")
    public R<Object> sendTencent(String phones, String templateId) {
        // 创建一个有序哈希表，用于存储短信模板参数
        LinkedHashMap<String, String> map = new LinkedHashMap<>(1);
        // 向哈希表中添加实际的短信验证码或信息内容
//        map.put("2", "测试测试");
        map.put("1", "1234");
        // 通过工厂模式获取短信服务实例，这里使用的是腾讯云的配置
        SmsBlend smsBlend = SmsFactory.getSmsBlend("config2");
        // 使用短信服务实例发送短信，并获取响应结果
        SmsResponse smsResponse = smsBlend.sendMessage(phones, templateId, map);
        return R.ok(smsResponse);
    }

    /**
     * 添加黑名单
     * 通过此接口将指定的手机号加入黑名单，以阻止该手机号接收短信
     *
     * @param phone 手机号
     * @return 返回操作结果
     */
    @GetMapping("/addBlacklist")
    public R<Object> addBlacklist(String phone){
        // 根据配置标识获取短信服务实例
        SmsBlend smsBlend = SmsFactory.getSmsBlend("config1");
        // 将手机号加入黑名单
        smsBlend.joinInBlacklist(phone);
        return R.ok();
    }

    /**
     * 移除黑名单
     *
     * @param phone 手机号 要从黑名单中移除的电话号码
     * @return 返回一个表示操作成功的结果对象
     */
    @GetMapping("/removeBlacklist")
    public R<Object> removeBlacklist(String phone){
        // 根据配置标识'config1'获取相应的短信服务实例
        SmsBlend smsBlend = SmsFactory.getSmsBlend("config1");
        // 将指定电话号码从黑名单中移除
        smsBlend.removeFromBlacklist(phone);
        return R.ok();
    }

}
